package com.example.jd.controller;

import com.example.jd.dao.IUserDao;
import com.example.jd.pojo.User;
import com.example.jd.util.HttpUtils;
import org.apache.http.HttpResponse;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * 这是java后端处理器
 * 用于接收前端请求，及响应前端
 */
@ResponseBody
@RestController
public class UserHandler {

    @Resource //自动产生一个IUserDao的代理对象
    IUserDao userDao;

    /**
     * 登入的处理方法
     *
     * @param mobile  电话号码
     * @param pwd    验证码
     * @param session 会话域
     * @return 返回登入结果 0 登入成功 1 登入失败
     */
    @RequestMapping("/login")
    int login(String mobile, String pwd, HttpSession session) {
        //判断用户是否注册
        User user = userDao.login(mobile);
        if (null == user) {
            return 1;
        }
        //判断密码是否正确
        pwd = DigestUtils.md5DigestAsHex(pwd.getBytes());
        String myPassword = user.getPwd();
        if (!myPassword.equals(pwd)) {
            return 1;
        }
        //把当前的用户信息存储到session内置对象中
        session.setAttribute("user", user);
        return 0;
    }
    //验证码登入
    /*int login(String mobile, String code, HttpSession session) {
        //判断验证码是否正确
        String myCode = (String) session.getAttribute("code");
        if (!myCode.equals(code)) {
            return 1;
        }
        //判断用户是否注册
        User user = userDao.login(mobile);
        if (null == user) {
            return 1;
        }
        //把当前的用户信息存储到session内置对象中
        session.setAttribute("user", user);
        return 0;
    }*/

    /**
     * 处理注册请求
     * @param mobile 前端传递过来的的手机号码
     * @param code 前端传递过来的验证码
     * @param session 会话域
     * @return 0-注册成功 1-验证码错误 2-手机号码已注册
     */
    @RequestMapping("/reg") //配置访问的地址
    Integer doRegister(String mobile, String code, HttpSession session) {
        String pwd = "123456";
        //查询手机号码是否已存在
        User user = userDao.login(mobile);
        if (null != user) { //用户手机号已注册
            return 2;
        }
        //md5加密算法
        pwd = DigestUtils.md5DigestAsHex(pwd.getBytes());
        //取出session保存的验证码
        String myCode = (String) session.getAttribute("code");
        //判断验证码是否正确 0 注册成功  1 验证码错误
        if (myCode.equals(code)) {
            userDao.reg(mobile, pwd);
        } else {
            return 1;
        }
        System.out.println(mobile + "->" + code);
        return 0;
    }

    @RequestMapping("/users")
    List<User> users() {
        return userDao.users();
    }

    /**
     * 请求前端发送验证码的请求
     * @param mobile 手机号
     * @param session 会话
     * @return 返回0代码成功发送
     */
    @RequestMapping("/send")
    int send(String mobile, HttpSession session) {
        String code = sendCode(mobile);
        //把生成的验证码存取到内存中
        session.setAttribute("code", code);
        return 0;
    }



    /**
     * 实现手机短信验证
     * @param mobile 手机号码
     * @return 返回随机生成的六位验证码
     */
    String sendCode(String mobile) {
        String host = "https://smsapi.api51.cn";
        String path = "/code/";
        String method = "GET";
        String appcode = "23e29cf944fd41df8b6250ebd7bcb940";
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Authorization", "APPCODE " + appcode);
        Map<String, String> querys = new HashMap<String, String>();
        String code = randomCode(); // 调用方法生成验证码
        querys.put("code", code);
        querys.put("mobile", mobile);
        try {
            HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);
            System.out.println(response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("最新验证码: " + code);
        return code;
    }

    /**
     * 随机生成六位数字验证码
     * @return 返回6位数验证码
     */
    private String randomCode() {
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        //nextInt(10) 随机生成一个0-9之间的整数
        for (int j = 0; j < 6; j++) {
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }
}
